home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
United Public Domain Gold 2
/
United Public Domain Gold 2.iso
/
music_utilities
/
pt037.dms
/
pt037.adf
/
docs
/
stonecracker.doc.pp
/
stonecracker.doc
Wrap
Text File
|
1989-07-26
|
13KB
|
350 lines
StoneCracker v4.01 - Command and Data File Cruncher
Written and developed by Jouni 'Mr.Spiv' Korhonen. I am 20 years old
_poor_ student from cold Finland. I study mathematics (and computer
science) in Helsinki University and every now and then waste a bit
of my spare time programming programs like StoneCracker.
This program is PD, freeware or what ever you want to call it and it
may be copied and used freely. But StoneCracker is NOT allowed to be
sold or used for any commercial purposes without my permission.
To contact me write to: PL 176
11101 Riihimaki
Finland
This will just be a brief overview of this cruncher utility. If you
can use such programs like PowerPacker or Imploder you can also use
the fabulous StoneCracker too.
First I will write down all the things StoneCracker v4.01 can do...
· There are three different filetypes that can be crunched with
StoneCracker: command files (=normal executable files), pure data
and absolute memory address located files.
· Command file cruncher can support standard hunk structures with
hunk_code, hunk_data, hunk_bss and hunk_reloc32. Hunk_debug and
hunk_symbol are removed when found. Note that StoneCracker refuses
to crunch programs which can not be relocated correctly after
decrunching process e.g programs with strange hunk structure, not
supported hunk type or overlayed files.
· Data files are crunched and saved as raw data. Only the decruncher
infoheader is added to the saved file. The form of the infoheader is:
DC.B "S401" ;the file was crunched with S401 algorithm
DC.L $000000 ;original file length
DC.L $000000 ;crunched file length
There is a sourcecode for the data decruncher at the end of this file.
· Absolute memory address located files are crunched as raw data so
you can not relocate any command files to absolute memory addresses.
Before saving the crunched file you are asked for some information
for the decruncher:
Load address - Locate your decrunched program here
High address - End of the memory area the decruncher may change or
corrupt while decrunching
Jump address - After decrunching jump here (start your program)
Decruncher - Place the decruncher code here (needs 230 bytes)
DmaCon - Set or mask the dmacon ($dff096) bits before
decrunching ($0 for no action)
IntEna - Set or mask the interrupt enable ($dff09a) bits
before decrunching ($0 for no action)
System Stack - Relocate SSP (supervisor or exception stackpointer).
When this field is non zero (<>$0) the value is moved
to SSP and processor turned to SuperVisor mode (I use
illegal instruction vector (at $0010.w) and command
Illegal). You better turn interrupts off when you
relocate the SSP.
Accept - Accept all values and save the file with a decruncher.
Notice that stacks are not used during decrunch process. If you change
dmacon or intena remember that decruncher does not restore original
values. Be careful with this filetype.
· BE CAREFUL WITH ODD VALUES! Decrunchers do not like odd values! It
is not a problem with data decruncher since you can take care of the
code yourself. But absolute address decruncher will crash!
· StoneCracker checks automatically if the file you want to crunch, is
already crunched with StoneCracker. All the three file types can be
decrunched and saved in their original form.
· When there is a crunched or decrunched file in buffer and you have
not saved the file yet, you can see a '*'-character as a sign of that
in the menubar. After saving the file the sign will disappear. When
quiting or going to sleep StoneCracker shows a requester if there is
a file in buffer which is not saved yet.
· Crunched data or absolute files can also be saved to tracks. Nice
option for programs that use trackdisk. Data files are tracked in the
same format as a normal data file. Absolute files are tracked with the
decruncher header but not with the hunk stuff in front of a normal
absolute file (tracked file is 36 bytes shorter).
· Delete files is useful when you need to kill some diskspace
consuming files from your disks.
· Sleep - This will free all allocated buffers, close windows, screens
and generally everything that StoneCracker needs. Only a little sleep
window appears to your WorkBench screen. You can run StoneCracker
again by pressing the right mousebutton on an activated sleep window.
· File type - Select which type files you want to crunch. Note that if
you change file type before saving the crunched file it will not
affect the file which is already in buffer waiting for saving. Default
is set to command file type.
· Decrunch color - Which color will flash ('Let there be light!')
during decrunch process. Default is set to no flashing.
· Show buffer info gives you some statistics about the buffer's
contents. Whether it is empty or is the file in the buffer crunched
or decrunched and which file type.
· Then there are several settings for hunklab. Note that they affect
only to command files when files are loaded into the buffer.
Remove Hunk_symbol - Loaded command file is scanned and if any
Hunk_symbols are found they are removed from the
file. Default setting is remove all Hunk_symbols.
Remove Hunk_debug - Same things to Hunk_debug as above. Note that the
decruncher can not relocate programs that have
Hunk_debugs or Hunk_symbols.
Hunk_code to Chip - Force all found Hunk_codes to be loaded into Chip
memory.
Hunk_data to Chip - Same as above for all Hunk_datas.
Hunk_bss to Chip - Same as above for all Hunk_bsses.
Well, I started developing this cruncher utility in November -91. I
was inspirated by the article of LZRW1 algorithm developed by the
dynamic duo ZIV-Lempel. Because this algorithm was really _fast_ I
made some testing with it. I was disappointed of the poor efficiency
and rewrote the algorithm using other methods to save crunched data.
The efficieny got heaps better but at the same time I lost most of
the speed. So the only thing what is left from the original algorithm
is the search funtion, everything else is developed and written by me.
A pity the algorithm still has poor efficiency but the crunching time
is _short_ - for example DPaint IV takes only 20 seconds! In average
StoneCracker is about _18_ (yes!) times _faster_ than PowerPacker.
A demoversion of StoneCracker (v4.00) got spread around and later I
thought it was a misstake. I should not have allowed it to happen and
consentrate more on v4.01. You know v4.00 was very plain. But now on
it is quite sure that I will not develope StoneCracker very much. Bug
fixes will be released when needed, maybe a better hunklab and turbo
mode (based almost directly on LZRW1). Anyway now I have finished my
research with crunching algorithms and reached what I wanted to - to
program a _fast_ and useful cruncher for my own purposes. I have
noticed that the only thing to develope (only worth developing) is
the user interface and it has nothing to do with algorithms so...
Now it is time to find a new district to explore! But let us continue
with the documentation...
Decrunchers are a combination of fast and short code. Especially the
command file decruncher was developed carefully and there should not
be much to optimize anymore (erm... I could rip four bytes away). The
decruncher and relocator take only 316 bytes (ha, beat it!). Then
there are also 104 bytes long control program which calls decruncher
and afterwards frees extra memory needed by the decruncher. After
decrunching only the original and control programs will be left.
The whole cruncher utility was written from scratch in assembly and
that is probably the reason why the program is so short (about 20Kb).
Very big thanks must go to * NICO FRANÇOIS * for the REQTOOLS which I
used for all requesters.
StoneCracker was developed using a normal A2000c (1.3) with standard
equipment (HD, extra memory etc). The program is KickStart 2.04
compatible and works as well in A3000. Because the program is
written in assembly and my second serious attempt in 'clean' system
programming it is quite obvious that there are some bugs around.
Please let me know about all the bugs so I can fix them. Please
contact me via the address at the beginning of this file since it
will be quite hard to reach me next year using other medias (all
Finns know what I mean...).
There is one thing that made the developement hard and slow. The lack
of literature. I have only used Includes & Autodocs and one loose
Abacus book as a reference. For example all my knowledge of Amiga's
hunks and how program is loaded into memory is based on experience.
Fortunately there are good programs around like Amiga Monitor by Timo
Rossi. I had already finished StoneCracker v4.01 when I at last found
a book that would have told me everything about hunks. I did not buy
it, yet.
I must thank following people for their help, ideas, bug-reports and
betatesting StoneCracker: Mape alias Darxon, Hot and especially Exterm
who found a nasty bug from the command file decruncher and drawind the
StoneCracker logo. If Mape does not stop nagging about utilities which
should support _stoned_ files, I will probably have to write some
PPmore style utilities. Next coming bigger 'Stone' utility should be
StoneSmasher - an ultimate Hunk_Tool for editing, verifying, fixing,
relocating, deleting and adding hunks to/from command files.
I hope you find this program worth using although it is not the most
fancy and powerful cruncher around. Use Imploder... It is surely the
best! Sorry for my bad Engleesh.
Click...
MOVEQ #0,D0
RTS ;succesful exit
Now I will explain how the crunched data must be decrunched... Notice
that S401 - algorithm does not decrunch data as almost every other
algorithm around. The crunched data is read from low memory to high
memory and then the decrunched data is written from low memory to high
memory too. Like this...
D=decrunched data, C=crunched data, M=memory area, S=security area
+---- high memory
|
+---- low memory | +---- security area
| | |
MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMSSSSSSSS
DDDDDDDDDDDDDDDDD...
| |
| +------< move decrunched data <-------CCCCCCCCCCCCCCCCC
| |
| +---- start of crunched data
+---- start of decrunched data
;-------------------------------------------------*
;- StoneCracker - v4.01 - Data decruncher
;-------------------------------------------------*
;
;inputs: a0=destination address
; a2=crunched data
;output: d0=0 if decrunched ok
; d0=-1 if not StoneCracker 'S401' data
;
;-------------- decrunch data - uses d0-d6/a0-a4
lzd_decrunch: cmp.l #"S401",(a2)+
beq.s lzd_trapantti_kayntiin
moveq #-1,d0
rts
lzd_trapantti_kayntiin:
moveq #2,d5
moveq #15,d6
move.l a0,a3
add.l (a2)+,a3 ;uncrunched length
move.l (a2)+,d0 ;crunched length
lzd_color: lea $dff1fe,a4
move (a2)+,d0
lsr #1,d6
addx d0,d0
bra.s lzd_first
lzd_ympari_mennaan_yhteen_tullaan:
add d0,d0
lzd_first: bne.s lzd_no_ovl1
move (a2)+,d0
move a2,(a4) ;'let there be light!'
addx d0,d0
lzd_no_ovl1: bcs.s lzd_xcopy
lzd_byte: moveq #0,d3
lzd_loop6: moveq #0,d2
moveq #2,d4
lzd_l1: add d0,d0
bne.s *+6
move (a2)+,d0
addx d0,d0
addx d2,d2
dbf d4,lzd_l1
add d2,d3
cmp d6,d2
beq.s lzd_loop6
lzd_arsi_ja_kopi_kavi_taalla:
moveq #7,d4
lzd_loop7: add d0,d0
bne.s *+6
move (a2)+,d0
addx d0,d0
addx.b d2,d2
dbf d4,lzd_loop7
move.b d2,(a0)+
dbf d3,lzd_arsi_ja_kopi_kavi_taalla
bra.s lzd_test
lzd_apuuva: dc.b 1,2,3,-1
lzd_xcopy: moveq #0,d2
moveq #1,d4
lzd_l3: add d0,d0
bne.s *+6
move (a2)+,d0
addx d0,d0
addx d2,d2
dbf d4,lzd_l3
moveq #0,d3
moveq #0,d1
move.b lzd_apuuva(pc,d2.w),d3
bmi.s lzd_loop4
lzd_loop3: add d0,d0
bne.s lzd_no_ovl4
move (a2)+,d0
addx d0,d0
lzd_no_ovl4: addx d1,d1
dbf d3,lzd_loop3
lzd_loop4: moveq #7,d4
lzd_l4: add d0,d0
bne.s *+6
move (a2)+,d0
addx d0,d0
addx d1,d1
dbf d4,lzd_l4
cmp d5,d2
blo.s lzd_naeman
moveq #0,d2
lzd_loop5: moveq #0,d3
moveq #2,d4
lzd_l5: add d0,d0
bne.s *+6
move (a2)+,d0
addx d0,d0
addx d3,d3
dbf d4,lzd_l5
add.l d3,d2
cmp d6,d3
beq.s lzd_loop5
lzd_naeman: addq.l #2,d2
move.l a0,a1
sub d1,a1
lzd_loop8: move.b (a1)+,(a0)+
subq.l #1,d2
bpl.s lzd_loop8
lzd_test: cmp.l a3,a0
blo lzd_ympari_mennaan_yhteen_tullaan
moveq #0,d0 ;decrunched ok
rts